<?php
namespace app\admin\controller;
use think\AjaxPage;
use think\Controller;
use think\Url;
use think\Config;
use think\Page;
use think\Verify;
use think\Db;
use think\Request;
class Goods extends BaseController
{
    //商品列表页
    public function index()
    {  
        $goodsRes=Db::table('goods')
                ->join('__GOODS_CATEGORY__','goods.cat_id=goods_category.id')
                ->field('goods.*,goods_category.cname')
                ->paginate(10);
        $this->assign('goodsList',$goodsRes);
    	return $this->fetch();
    }
     /**
     * 添加商品
     *2017-6-43
     */
    public function goodsAdd(Request $request){
        //判断是否有数据提交
        if($request->param()){
            //获取上传数据数组
            $res = $request->param();
            if(!$res['goodsthumb']){
                $res['goodsthumb']='/static/images/no_thumb.png';
            }
            // if (empty($res['name'])) {
            //     $this->error('没有填写任何信息');
            // }
            //循环判断数组内是否为数字,如果是放入新数组
            for($i=1;$i<=3;$i++){
               if(is_numeric($res['cid_'.$i])){
                    $cidArr[]=$res['cid_'.$i];
               }
            }
            if(!empty($cidArr)){
                $res['cid']=array_pop($cidArr);
            }else{
                //false
                $res['cid']=0;
            }
            /*
            *检测是否提交过数据过来
            */
            $thumbStr = $res['thumblist'];
            if (empty($thumbStr)) {
                $this->error('最少也要选择一个商品的图,求真相');
            }else{
                /*
                * 对传递过来的数据进行重组
                */
                $thumbArr=explode(',',$thumbStr);
                /*
                * 检测数组是否有个下标为空的键值,两个以上有多余的空格,如果有就删除掉
                */
                if(in_array('',$thumbArr)){
                    array_pop($thumbArr);
                }
                /*
                *对提交的数据进行name和url的数组分割
                *return $thumbArrName=>图片名字数组 $thumbArrUrl=>图片地址数组
                */
                foreach ($thumbArr as $key => $value) {
                    if ($key%2==0) {
                        $thumbArrName[]=$value;
                    }else{
                        $thumbArrUrl[]=$value;
                    }
                }                
            }
            /*
            *重新分配商品信息数据 return $insertData
            */
            
            $insertData=array(                    
                'cat_id'=>$res['cid'],
                'brand_id'=>$res['brank'],
                'name'=>$res['name'],
                'price'=>$res['price'],
                'stock'=>$res['stock'],
                'describe'=>$res['goods_desc'],
                'goodsinfo'=>$res['goods_info'],
                'type'=>$res['goods_type'],
                'is_shelf'=>$res['is_shelf'],
                'on_time'=>time(),
                'thumb'=>$res['goodsthumb'],
            );
            /*
            * 将商品信息写入商品表,并对商品图片进行处理
            */
            if ($goodsRes=GoodsModel::create($insertData)) {
                //如果数据添加成功->处理图片数据->遍历图片数组
                foreach($thumbArrUrl as $key=>$file){
                    //获取图片name
                    $filepath=substr($file,strrpos($file,'/')-8,8);
                    $filename=substr($file,strrpos($file,'/')+1,strlen($file));
                    //图片处理->获取图片对象
                    $image= \think\Image::open('.'.$file);                    
                    //生成大中小三种图片
                    $image->thumb(800,800)->save(ROOT_PATH . 'public' . DS . 'upload' . DS . 'thumb_big'. DS .$filename);
                    $image->thumb(500,500)->save(ROOT_PATH . 'public' . DS . 'upload' . DS . 'thumb_mid'. DS .$filename);
                    $image->thumb(150, 150)->save(ROOT_PATH . 'public' . DS . 'upload' . DS . 'thumb_sm'. DS .$filename);
                    //得到文件后缀名
                    $spec=explode('.',$filename);                
                    //图片对象处理完成 ->存在
                    if($image){                        
                        //整理待添加的图片数据
                        $thumbImgData=array(
                            'album_id'=>$goodsRes->id,
                            'pic_name'=>$thumbArrName[$key],
                            'pic_cover'=>DS . 'upload' . DS . 'image'. DS .$filepath. DS .$thumbArrName[$key],
                            'pic_spec'=>$spec[1],
                            'pic_cover_big'=>DS . 'upload' . DS . 'thumb_big'. DS .$filename,
                            'pic_cover_mid'=>DS . 'upload' . DS . 'thumb_big'. DS .$filename,
                            'pic_cover_small'=>DS . 'upload' . DS . 'thumb_sm'. DS .$filename,
                            'upload_time'=>time()
                            );
                        //添加
                        picsModel::create($thumbImgData);
                    }else{
                        // 上传失败获取错误信息
                        echo $file->getError();
                    }
                }
                return $this->success('添加 '.$goodsRes->name.' 商品成功了');
            }            
        }
        //获取栏目菜单列表和商品品牌列表
        $goods_category_menu=$this->categoryModel->getmenu(0);
        $goods_brand_menu=$this->brandModel->all();
        //获取商品规格项
        $goodsType=$this->goodsTypeModel->select();
        $this->assign('categoryList',$goods_category_menu);
        $this->assign('brandList',$goods_brand_menu);
        $this->assign('typeList',$goodsType);
        return $this->fetch(); 
    }
    //商品品牌列表页
    public function goods_brand(){
        $brandRes=$this->brandModel->select();
        $this->assign('brandList',$brandRes);
        return $this->fetch();
    }
    //添加商品品牌
    public function brand_add(Request $request){
        if($res=$request->param()){
            //获取表单上传文件
            $file = $request->file('logo');
            if (empty($file)) {
                $this->error('请选择上传文件');
            }
            $info = $file->validate(['ext'=>'jpg,png,gif'])->move(ROOT_PATH . 'upload' . DS . 'brand');
            if ($info) {
                $filepath='upload' . DS . 'brand'. DS .$info->getSaveName();
                $res['logo']=$filepath;
                if ($brandRes=brandModel::create($res)) {
                    return $this->success('添加品牌'.$brandRes->name.'成功了');
                }
            } else {
                // 上传失败获取错误信息
                $this->error($file->getError());
             }
        }
        $tableGoodsArr=new categoryModel;
        $goods_category_menu=$tableGoodsArr->getmenu(0);
        $this->assign('categoryList',$goods_category_menu);
        return $this->fetch();
    }
    //商品分类主页列表
    public function category(Request $request){
        if($res=$request->param()){            
            $catData=new categoryModel;
            if ($res['pid']==0) {
                $res['level']=1;
            }
            if ($catres=$catData->create($res)) {
                return $this->success('用户'.$catres->id.'成功了');
            }
        }else{
            $tableGoodsArr=new categoryModel;
            $goods_category_menu=$tableGoodsArr->getmenu();
            $this->assign('category_menu',$goods_category_menu);
            return $this->fetch();
        }       
    }
    //添加商品分类
    public function addCategory(Request $request){
        if($res=$request->param()){
            //判断是否为顶级目录
            if ($res['pid']!=0) {
                //非顶级目录的话
                $res['path']=categoryModel::get($res['pid'])['path'].'_'.$res['pid'];
                $res['level']=categoryModel::get($res['pid'])['level']+1;
            }else{
                //顶级目录
                $res['level']=1;
            }
            //写入数据
            if($catres=categoryModel::create($res)){
                return $this->success('栏目 '.$catres->cname.'添加成功','category');
            }
        }
        $tableGoodsArr=new categoryModel;
        $goods_category_menu=$tableGoodsArr->getmenu();
        $this->assign('cat_list',$goods_category_menu);
        return $this->fetch();
    }
    /*
    * 根据pid获取子类
    * 
    */
    public function getCateChild(Request $request){
        $pid=$request->get('pid');
        $cateNameArr=$this->categoryModel->getmenu($pid);
        echo "<option>选择子类</option>";
        foreach ($cateNameArr as $row) {
            echo "<option value=".$row['id'].">".$row['cname']."</option>";
        }
    }
    //商品类型管理
    public function goods_type(Request $request){
        if($request->isAjax()){
            $action=$request->post('action');
            switch ($action) {
                case 'add':
                    $goodsType['name']=$request->post('name');
                    if($res=typeModel::create($goodsType)){
                        $rstr=array('id'=>$res['id'],'code'=>200,'status'=>'ok');
                        return json($rstr);
                    }
                    break;
                case 'del':
                    $delid=$request->post('id');
                    if(typeModel::where('id','=',$delid)->delete()){
                        $rstr=array('code'=>200,'status'=>'ok');
                        return json($rstr);
                    }
                    break;            
                default:
                    # code...
                    break;
            }            
        }else if($request->post()){
            $goodsTypeUpdata=new typeModel;
            $goodsTypeUpdata->save(['name'  => $request->post('typename')],['id' => $request->post('id')]);
        }
        $typeArr=typeModel::order('id','desc')->paginate(10);
        $this->assign('typeList',$typeArr);
        return $this->fetch();
    }
    //商品类型修改
    public function goodsTypeEdit(Request $request){
        if($request->get()){
            $typeId=$request->get('id');
            $result=typeModel::get($typeId);
            $this->assign([
                'typeId'=>$typeId,
                'typeName'=>$result['name']                    
                ]);
            return $this->fetch();
        }else{
            $this->error('非法参数','goods_type');
        }
        
    }
    /*
    * 获取商品类型下的规格项
    *
    */
    public function ajaxGetSpecItem(Request $request){
        if($request->isAjax()){
            $id=$request->param('id');
            //规格名录
            $specArr = $this->specModel->getSpecItem($id);
            foreach ($specArr as &$val) {
                $val['child']=$this->specItemModel->getSpecChild($val['id']);
            }
            return $specArr;
        }
    }
    //商品规格管理
    public function goodsSpec(){
        $result = Db::view('spec','id,name,order')
            ->view('goods_type',['name'=>'gname'],'spec.type_id=goods_type.id')
            ->order('spec.id desc')
            ->select();
        //定义新的空数组,view中显示
        $newRes=array();
        //根据数组的值取出规格项目
        foreach ($result as $value) {
            $res=Db::table('spec_item')->where('spec_id',$value['id'])->column('item');
            //添加到数组中,重新组织数据
            $value['item']=$res;
            //压入到一个新数组
            array_push($newRes,$value);
        }
        $this->assign('goodsType',$newRes);
        return $this->fetch();
    }
    //添加商品规格
    public function addSpec(Request $request){
        //post提交数据
        if($request->isPost()){
            //获取数据$specArrayData,准备specItem数据
            $specArrayData['name']=$request->param('name');
            $specArrayData['type_id']=$request->param('type_id');
            $specArrayData['order']=$request->param('order');
            $specItemStr=$request->param('specItem');
            $specItemArr=explode("\n",$specItemStr);
            if($result=specModel::create($specArrayData)){
                foreach ($specItemArr as $value) {
                    $itemData['spec_id']=$result->id;
                    $itemData['item']=$value;
                    SpecItemModel::create($itemData);
                }
                $this->success('添加商品规格'.$result->name.'成功');
            }
        }
        $selectTypeData=typeModel::select();
        $this->assign('typeData',$selectTypeData);
        return $this->fetch();
    }
    //修改商品规格
    public function updataSpec(Request $request){
        //post提交数据修改
        if($request->isPost()){
            //获取数据$specArrayData,准备specItem数据
            $specArrayData['name']=$request->param('name');
            $specArrayData['type_id']=$request->param('type_id');
            $specArrayData['order']=$request->param('order');
            $upDataId=$request->param('id');
            //取得规则项
            $specItemStr=$request->param('specItem');
            $specItemArr=explode("\n",$specItemStr);
            //修改spec数据库中的数据
            $GoodsSpec=new specModel;
            $GoodsSpec->where('id',$upDataId)->update($specArrayData);
            //实例化规格类
            $GoodsSpecItem=new SpecItemModel;
            //根据规格id查询有多少项
            $arr=$GoodsSpecItem->where('spec_id',$upDataId)->select();
            //取得id放入数组
            foreach($arr as $val) {
            	//取得要更换的item的id
            	$itemId[]=$val['id'];
            }
            //判断数据库现有的规格数是否大于要更新的数，如果大于的话，先将多余的清除掉
            if(count($itemId)>count($specItemArr)){
            	//进行数据处理，清除掉多余的项
    			$num=count($itemId)-count($specItemArr);
    			for ($j=0; $j < $num; $j++) { 
    				$specItemOne=array_pop($itemId);
    				SpecItemModel::destroy($specItemOne);
    			}
    			// 
    		}
    		//修改的规格项和原规格项相同或者大于原规格项
            for ($i=0; $i < count($specItemArr); $i++) { 
            	//如果修改数据和原数据相同的情况下
            	if(isset($itemId[$i])){
            		$GoodsSpecItem->where('id',$itemId[$i])->update(['item'=>$specItemArr[$i]]);
            	}else{
            		//当修改的数据大于原数据,将进行新增
            		$data = ['spec_id' => $upDataId, 'item' => $specItemArr[$i]];
            		Db::table('spec_item')->insert($data);
            	}
            }
        }
        if($request->get()){
            $id=$request->param('id');
            $specResult=specModel::get($id);
            $itemResult=Db::table('spec_item')->where('spec_id',$id)->select();
            foreach ($itemResult as $value) {
                # code...
                $itemResultArr[]=$value['item'];
            }
            $specItemStr=implode("\n",$itemResultArr);
        }
        $selectTypeData=typeModel::select();
        $this->assign([
            'typeData'=>$selectTypeData,
            'specId'=>$specResult['id'],
            'typeId'=>$specResult['type_id'],
            'specName'=>$specResult['name'],
            'specOrder'=>$specResult['order'],
            'specItem'=>$specItemStr
            ]);
        return $this->fetch();
    }
    /**
     * 动态获取商品规格选择框 根据不同的数据返回不同的选择框
     */
    public function ajaxGetSpecSelect(Request $request){
        $id=$request->param('spec_type');
        //获取规格列表
        $specList=$this->specModel->where('type_id',$id)->select();
        //遍历规格
        foreach ($specList as &$val) {
            $val['spec_item']=$this->specItemModel->where('spec_id',$val['id'])->select();
        }
        $this->assign('specList',$specList);
        return $this->fetch('ajax_spec_select');
    }
    /**
     * 动态获取商品规格输入框 根据不同的数据返回不同的输入框
     */    
    // public function ajaxGetSpecInput(Request $request){
    //     $specList=$this->specModel->field('id,name')->select();
    //     $specItemList=$this->specItemModel->field('id,item')->select();
    //     $spec_id=$request->param('spec_id');
    //     $item_id=$request->param('item_id');
    //     foreach ($specList as $val) {
    //         if($val['id']==$spec_id){
    //             $sname=$val['name'];
    //         }            
    //     }
    //     foreach ($specItemList as $valItem) {
    //         if($valItem['id']==$item_id){
    //             $sItem=$valItem['item'];
    //         }            
    //     }
    //     $str = "<table class='table table-bordered' id='spec_input_tab'>";
    //     $str .="<tr>";
    //     $str .="<td>{$sname}</td>";
    //     $str .= "<td>{$sItem}</td>";
    //     $str .= "<td>价格<input type='text' id='{$spec_id}' name='{$item_id}'></td>";
    //     $str .="</tr>";
    //     $str .="</table>";
    //     return $str;
    // }
    public function ajaxGetSpecInput(){     
         $GoodsLogic = new GoodsLogic();
         $goods_id = I('goods_id/d') ? I('goods_id/d') : 0;
         $str = $GoodsLogic->getSpecInput($goods_id ,I('post.spec_arr/a',[[]]));
         exit($str);   
    }

    public function getSpecInput($spec_arr)
    {
        //对选择的数组进行统计,放入新的数组
        foreach($spec_arr as $key=>$val){
            // $key 是spec中的id
            // $val是spec_item中的id
            $arr[$key]=count($val);
        }
        //安装数组的val进行排序
        arsort($arr);
        //重新遍历进行重组新的数组
        foreach ($arr as $key =>$val)
        {
            $spec_arr2[$key] = $spec_arr[$key];
        }
        foreach ($arr as $key1 =>$val1)
        {
            $spec_arr3[$key1] = $spec_arr2[$key1];
        }
        //返回一个规格的名称数组
        $spec_name = array_keys($spec_arr3);
        //查出所有规格项列表
        $spec=$this->specModel->field('id,name')->select();
        $specItem=$this->specItemModel->field('id,item,spec_id')->select();
        //处理成为一维数组,key为id,val为name
        foreach ($spec as $vals) {
            $newSpec[$vals['id']]=$vals['name'];
        }
        foreach ($specItem as $key => $value) {
            $newSpecItem[$key+1]=$value;
        }
        $str = "<table class='table table-bordered' id='spec_input_tab'>";
        $str .="<tr>";
        // 第一行的数据

        foreach ($spec_name as $k => $v) 
        {
           $str .="<td><b>{$newSpec[$v]}</b></td>";
        }
        $str .="<td><b>价格</b></td>
               <td><b>库存</b></td>
               <td><b>SKU</b></td>
             </tr>";
        // 显示第二行开始
       foreach ($spec_arr3 as $k => $v)
       {

            
            //声明一个item数组存放key
            $item_key_name = array();
            foreach($v as $k2 => $v2)
            {
                $str .="<tr>";
                $str .="<td>{$newSpecItem[$v2]['item']}</td>";
                $item_key_name[$v2] = $spec[$newSpecItem[$v2]['spec_id']].':'.$newSpecItem[$v2]['item'];
                ksort($item_key_name);
            $item_key = implode('_', array_keys($item_key_name));
            $item_name = implode(' ', $item_key_name);
            
            // $keySpecGoodsPrice[$item_key][price] ? false : $keySpecGoodsPrice[$item_key][price] = 0; // 价格默认为0
            // $keySpecGoodsPrice[$item_key][store_count] ? false : $keySpecGoodsPrice[$item_key][store_count] = 0; //库存默认为0
            $str .="<td><input name='item[$item_key][price]' value='' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\")' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\")' /></td>";
            $str .="<td><input name='item[$item_key][store_count]' value='' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\")' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\")'/></td>";            
            $str .="<td><input name='item[$item_key][sku]' value='' />
                <input type='hidden' name='item[$item_key][key_name]' value='$item_name' /></td>";
            $str .="</tr>"; 
            }   
                      
       }
        $str .= "</table>";
        return $str;
    }
}
